package com.micro.modual.model.vo;

import com.micro.modual.model.enums.CouponCategory;
import com.micro.modual.model.enums.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * @desc 优惠券规则对象
 * @author LevelCoder
 * @version V1.0.0
 * @email LevelCoder@126.com
 * @date 2020/2/8
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TemplateRule implements Serializable{


    /**
     * 优惠券过期规则
     */
    private Expiration expiration;

    /**
     * 折扣
     */
    private Discount discount;

    /**
     * 每个人最多领取几张的限制
     */
    private Integer limitation;

    /**
     * 使用范围:地域 + 商品类型
     */
    private Usage usage;

    /**
     * 权重(可以和哪些优惠券叠加使用,需要注意同一类的优惠券不能叠加使用)list[],优惠券唯一编码
     */
    private String weight;


    /**
     * 检验
     * @return
     */
    public boolean validata(){
        //        && StringUtils.isNotEmpty(weight)  组合优惠券后续业务追加
        return expiration.validate() && discount.validate() && limitation > 0 && usage.validate() ;
    }


    /**
     * 有效期 内部类
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Expiration {

        /**
         * 有效期规则:对应PeriodType中code字段
         */
        private Integer period;

        /**
         * 有效间隔:只对变动性有效期有效
         */
        private Integer gap;

        /**
         * 优惠券模版的失效日期:两类规则都有效
         */
        private Date deadline;

        /**
         * 校验
         * @return
         */
        boolean validate(){
            boolean validateGap = true;
            if(period == 2){
                validateGap = gap > 0;
            }
            return null != PeriodType.of(period) && validateGap && deadline != null;
        }
    }

    /**
     * 折扣规则 需要和类型配合决定
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Discount{

        /**
         * 优惠券类型.用于内部校验
         */
        private String couponCategory;

        /**
         * 额度:满减(20),折扣(85),立减(10)
         */
        private Integer quota;

        /**
         * 基准:需要满多少才可用(只有在满减券m,立减下才有效)
         */
        private  Integer base;

        /**
         * 规则校验
         * @return
         */
        boolean validate(){
            boolean validateBase = true;
            boolean validateQuota = true;
            if(couponCategory.equals(CouponCategory.DISCOUNT.getCode())){
                if(quota <0 || quota>100){
                    validateQuota = false;
                }
            }else{
                validateQuota = quota>0;
                validateBase = base>0;
            }
            return  validateQuota && validateBase;
        }
    }

    /**
     * 使用范围:如果省份和城市为空则针对区域不做限制
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Usage{

        /**
         * 省份
         */
        private String province;

        /**
         * 城市
         */
        private String city;

        /**
         * 商品类型  list[文娱,生鲜,家具,全品类]
         */
        private List<String> goodsType;

        /**
         * ﻿使用类别 1.全平台通用 2.指令品类通用
         */
        private Integer useType;

        /**
         * 规则校验
         * @return
         */
        boolean validate(){
            boolean validateGoodsType = true;
            if(useType == 2){
                validateGoodsType = CollectionUtils.isNotEmpty(goodsType);
            }
            return validateGoodsType;
        }
    }

}
